Les buts du présent projet sont explicité à la section~\ref{sec:buts}. Étant donné que l'environnement ne contient pas de marqueur facilement reconnaissable, il est impossible d'utiliser une approche SLAM telle qu'elle a été décrite dans le cours. En effet, celle-ci se fie à des marqueurs pouvant être automatiquement détectés dans l'environnement ou bien des marqueurs placés manuellement. Pour cette raison, une approche par ICP et odométrie est utilisée.

\subsection{Cartographie}
\label{sec:cartographie}
La carte de l'environnement est créée à partir de la Kinect. Celle-ci retourne une carte des profondeurs où chaque pixel est en fait la distance entre le récepteur de la Kinect et la surface visible à ce pixel. Étant donné que la carte de l'environnement est seulement une carte en deux dimensions, une bande au centre de l'image d'un nombre de pixels paramétrables est utilisée. Un moyennage est effectué sur cette bande de pixels pour avoir la distance moyenne au centre de l'image. Une fois la distance moyenne obtenue, on retrouve la distance de tous les points par rapport à la caméra en X et en Y. Cette distance est obtenue à l'aide du théorème de Pythagore et du modèle de caméra du type sténopé.

Le nuage de points obtenu est ensuite replacé dans le repère monde. La coordonnée initiale du repère monde est la pose du robot lorsque le système démarre. Pour ce faire, on applique une opération de rotation et de translation. Les paramètres de ces opérations sont déterminés par la pose du robot au moment où la photo est prise à l'aide de la Kinect. La section~\ref{sec:odometrie} contient les détails liés à l'obtention d'une pose la plus fiable possible.

Pour pouvoir avoir une carte de l'environnement complète, des rotations de 360 degrés sont effectuées à l'aide du robot en prenant des photos à l'aide de la Kinect à tous les 15 degrés. Ces images nous permettent de reconstruire l'environnement autour du robot à plusieurs points lors du parcours.

\subsection{Odométrie}
\label{sec:odometrie}

Pour pouvoir recréer une carte fiable de l'environnement ainsi que pour pouvoir revenir à son point de départ, le robot doit être capable d'avoir une bonne estimation de sa pose. Pour ce faire, trois éléments sont utilisés. Premièrement, les commandes envoyées pour les déplacements sont utilisées pour connaître une estimation des déplacements. Deuxièmement, un gyroscope est utilisé pour avoir une information extéroceptive sur les rotations effectuées par le robot. Finalement, une estimation des déplacements est effectuée par l'algorithme ICP. Ces informations sont intégrées à l'aide d'un filtre de Kalman étendu.

\subsubsection{ICP}

L'algorithme ICP est utilisé pour avoir une information d'un capteur extéroceptif sur la pose du robot. Celui-ci est utilisé avec le nuage de points retourné par la Kinect à la section~\ref{sec:cartographie}. Cet algorithme retourne la matrice de rotation et la matrice de translation à utiliser pour déplacer les points d'un ensemble de façon à ce qu'il soit superposé aux points les plus près d'un modèle.

Dans le cas du projet, le modèle utilisé est la carte de l'environnement que le robot a accumulé à ce moment. Les points que celui-ci essaie de superposer à ce modèle sont contenus dans le nuage de points obtenu par la Kinect. Afin d'avoir des performances plus acceptables, ces points sont préalablement transformés avec la pose estimée du robot. En récupérant la valeur à l'index $(1,1)$ de la matrice de rotation, il est possible d'avoir la valeur de l'erreur en angle estimé par ICP. En effet, il suffit de faire l'arccosinus de cette valeur pour avoir l'erreur en angle. Les valeurs d'erreur de la pose sont données par les valeurs $(1,3)$ et $(2,3)$ de la matrice de translation.

\subsubsection{Kalman}

Pour intégrer les informations, un filtre de Kalman étendu est utilisé. Celui-ci intègre les informations du gyroscope, des commandes envoyées au robot ainsi que les valeurs retournées par ICP pour pouvoir établir une valeur de pose tenant compte de ces valeurs de façon presque optimale. La valeur n'est pas optimale, car les informations obtenues par les capteurs ne sont pas toutes linéaires et il est donc impossible d'utiliser un filtre de Kalman classique. 

\subsection{Machine à état}

Les figures~\ref{fig:diag_explore} et~\ref{fig:diag_retour} montre les machines à états du robot pendant la phase d'exploration du robot. Dans la phase d'exploration, le but du robot est de couvrir une certaine distance en évitant les obstacles et en cartographiant l'environnement. Dans la phase de retour, le robot revisite les points par lesquels il est passé dans la phase d'exploration. Il doit donc encore une fois utiliser les techniques d'odométrie pour ne pas diverger entre la pose du robot estimé et la pose réelle du robot.

\begin{figure}[ht]
 \begin{center}
  \begin{tabular}{c}
    \includegraphics[width=3in]{Diagramme2.png} 
  \end{tabular}
 \end{center}
 \caption{Diagramme d'état de la phase d'exploration.}
 \label{fig:diag_explore}
\end{figure}

\begin{figure}[ht]
 \begin{center}
  \begin{tabular}{c}
    \includegraphics[width=3in]{Diagramme3.png} 
  \end{tabular}
 \end{center}
 \caption{Diagramme d'état de la phase de retour.}
 \label{fig:diag_retour}
\end{figure}

